/*
 * Copyright ©2021 su binglun(9085309@qq.com). All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *---------------------------------------------------------------------
 *-                                                                   -
 *-           Website : http://phoenix.sunny360.cn/                   -
 *-                                                                   -
 *---------------------------------------------------------------------
 */
package cn.sunny360.core.handler.http;

import cn.sunny360.core.common.PhResult;
import cn.sunny360.messsage.MsgResult;
import io.vertx.core.Promise;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.RoutingContext;

public class HttpBaseHandler {

	protected void badRequest(RoutingContext context, Throwable ex) {
		context.response().setStatusCode(400).putHeader("content-type", "application/json")
				.end(new JsonObject().put("error", ex.getMessage()).encodePrettily());
	}

	protected void notFound(RoutingContext context) {
		context.response().setStatusCode(404).putHeader("content-type", "application/json")
				.end(new JsonObject().put("message", "not_found").encodePrettily());
	}

	protected void internalError(RoutingContext context, Throwable ex) {
		context.response().setStatusCode(500).putHeader("content-type", "application/json")
				.end(new JsonObject().put("error", ex.getMessage()).encodePrettily());
	}

	protected void badResult(RoutingContext context, Throwable ex) {
		MsgResult result = MsgResult.newInstance()
				.setStatus(500)
				.setMsg(ex.getMessage());
		context.response()
				.setStatusCode(200)
				.putHeader("content-type", "application/octet-stream;charset=utf-8")
				.end(Buffer.buffer(result.toByteArray()));
	}

	protected void badResult(RoutingContext context, String msg) {
		MsgResult result = MsgResult.newInstance()
				.setStatus(500)
				.setMsg(msg);
		context.response()
				.setStatusCode(200)
				.putHeader("content-type", "application/octet-stream;charset=utf-8")
				.end(Buffer.buffer(result.toByteArray()));
	}

	protected void okResult(RoutingContext context, String msg, String data) {
		MsgResult result = MsgResult.newInstance()
				.setStatus(200)
				.setMsg(msg)
				.setData(data);
		context.response().setStatusCode(200)
				.putHeader("content-type", "application/octet-stream;charset=utf-8")
				.end(Buffer.buffer(result.toByteArray()));
	}

	protected void okResult(RoutingContext context, PhResult r) {
		MsgResult result = MsgResult.newInstance()
				.setStatus(200)
				.setMsg(r.getMsg())
				.setData(r.getData());
		context.response().setStatusCode(200)
				.putHeader("content-type", "application/octet-stream;charset=utf-8")
				.end(Buffer.buffer(result.toByteArray()));
	}

	protected void okRestResult(RoutingContext context, JsonObject result) {
		context.response().setStatusCode(200)
				.putHeader("content-type", "application/json")
				.end(result.toBuffer());
	}

	protected void promiseHandlerResult(RoutingContext context, Promise<?> promise) {
		promise.future()
			.onSuccess(result->{
				okResult(context, "OK", result.toString());
			})
			.onFailure(e->{
				badResult(context, e);
			});
	}

}
